# -*- coding: utf-8 -*-
"""
批量上传图片到后台的脚本
使用方法：
    python scripts/batch-upload-images.py

或者指定参数：
    python scripts/batch-upload-images.py --api-url http://localhost:3001 --api-key your-api-key
"""
import os
import sys
import json
import argparse
import requests
from pathlib import Path

# 默认配置
DEFAULT_API_URL = 'http://localhost:3001'
DEFAULT_API_KEY = 'your-api-key'

# 示例图片数据（可以替换为实际的图片数据）
SAMPLE_IMAGES = [
    {
        "title": "美丽风景1",
        "url": "https://picsum.photos/800/1200?random=1",
        "thumbnail": "https://picsum.photos/400/600?random=1",
        "categoryId": 1,
        "width": 800,
        "height": 1200,
        "size": 0
    },
    {
        "title": "美丽风景2",
        "url": "https://picsum.photos/800/1200?random=2",
        "thumbnail": "https://picsum.photos/400/600?random=2",
        "categoryId": 1,
        "width": 800,
        "height": 1200,
        "size": 0
    },
    {
        "title": "时尚穿搭1",
        "url": "https://picsum.photos/800/1200?random=3",
        "thumbnail": "https://picsum.photos/400/600?random=3",
        "categoryId": 2,
        "width": 800,
        "height": 1200,
        "size": 0
    },
    {
        "title": "时尚穿搭2",
        "url": "https://picsum.photos/800/1200?random=4",
        "thumbnail": "https://picsum.photos/400/600?random=4",
        "categoryId": 2,
        "width": 800,
        "height": 1200,
        "size": 0
    },
    {
        "title": "生活日常1",
        "url": "https://picsum.photos/800/1200?random=5",
        "thumbnail": "https://picsum.photos/400/600?random=5",
        "categoryId": 3,
        "width": 800,
        "height": 1200,
        "size": 0
    },
    {
        "title": "生活日常2",
        "url": "https://picsum.photos/800/1200?random=6",
        "thumbnail": "https://picsum.photos/400/600?random=6",
        "categoryId": 3,
        "width": 800,
        "height": 1200,
        "size": 0
    }
]


def create_default_categories(api_url, api_key):
    """创建默认分类"""
    print('[1] 检查并创建默认分类...')
    
    # 先尝试登录获取 token（如果需要）
    # 这里直接使用 API Key，所以不需要登录
    
    categories = [
        {"name": "风景", "slug": "landscape", "description": "美丽的风景图片", "sort": 1},
        {"name": "时尚", "slug": "fashion", "description": "时尚穿搭图片", "sort": 2},
        {"name": "生活", "slug": "life", "description": "日常生活图片", "sort": 3}
    ]
    
    category_map = {}
    
    for cat in categories:
        try:
            # 注意：创建分类需要认证，这里应该先登录或使用 API Key
            # 为了简化，假设分类已存在，可以手动创建
            print(f'   提示: 请确保分类 "{cat["name"]}" (slug: {cat["slug"]}) 已存在')
            print(f'   如果不存在，请先通过管理后台创建分类')
            # 这里应该返回分类ID，暂时使用slug映射
            category_map[cat["slug"]] = None  # 需要实际的ID
        except Exception as e:
            print(f'   警告: 创建分类失败: {e}')
    
    return category_map


def upload_images(api_url, api_key, images):
    """批量上传图片"""
    url = f'{api_url}/admin/images/batch'
    headers = {
        'Content-Type': 'application/json',
        'X-API-Key': api_key
    }
    
    payload = {
        'images': images
    }
    
    print(f'[2] 正在上传 {len(images)} 张图片...')
    print(f'   接口地址: {url}')
    
    try:
        response = requests.post(url, json=payload, headers=headers, timeout=30)
        
        if response.status_code == 200:
            result = response.json()
            # 处理标准响应格式 { code, message, data }
            if isinstance(result, dict) and result.get('code') == 200:
                data = result.get('data', {})
                success = data.get('success', 0)
                failed = data.get('failed', 0)
                ids = data.get('ids', [])
                
                print(f'   ✓ 成功: {success} 张')
                if failed > 0:
                    print(f'   ✗ 失败: {failed} 张')
                if ids:
                    print(f'   图片ID: {ids[:10]}{"..." if len(ids) > 10 else ""}')
                return True
            else:
                print(f'   ✗ 上传失败: {result.get("message", "未知错误")}')
                print(f'   响应内容: {result}')
                return False
        elif response.status_code == 401:
            print('   ✗ 认证失败: API Key 无效')
            print(f'   请检查 API Key: {api_key}')
            return False
        else:
            print(f'   ✗ 请求失败: HTTP {response.status_code}')
            print(f'   响应: {response.text[:200]}')
            return False
            
    except requests.exceptions.ConnectionError:
        print(f'   ✗ 连接失败: 无法连接到 {api_url}')
        print('   请确保 Admin 服务正在运行')
        return False
    except Exception as e:
        print(f'   ✗ 错误: {e}')
        return False


def get_categories(api_url, api_key):
    """获取分类列表，返回 slug 到 ID 的映射"""
    # 注意：这个接口需要认证，如果使用 API Key，可能需要特殊处理
    # 暂时返回硬编码的映射，或者要求用户先创建分类
    print('[提示] 请先通过管理后台创建以下分类：')
    print('   1. 风景 (slug: landscape)')
    print('   2. 时尚 (slug: fashion)')
    print('   3. 生活 (slug: life)')
    print('   或者修改脚本中的 categoryId')
    
    # 如果有分类ID，可以返回映射
    # 这里暂时返回空映射，需要手动设置
    return {}


def main():
    parser = argparse.ArgumentParser(description='批量上传图片到后台')
    parser.add_argument('--api-url', default=DEFAULT_API_URL, help='API 服务地址')
    parser.add_argument('--api-key', default=DEFAULT_API_KEY, help='API Key')
    parser.add_argument('--data-file', help='JSON 文件路径（包含图片数据）')
    parser.add_argument('--category-id', type=int, help='统一分类ID（如果所有图片使用同一分类）')
    
    args = parser.parse_args()
    
    print('====================================')
    print('   批量上传图片脚本')
    print('====================================')
    print('')
    print(f'API 地址: {args.api_url}')
    print(f'API Key: {args.api_key[:10]}...' if len(args.api_key) > 10 else f'API Key: {args.api_key}')
    print('')
    
    # 读取图片数据
    if args.data_file:
        if not os.path.exists(args.data_file):
            print(f'错误: 文件不存在: {args.data_file}')
            sys.exit(1)
        with open(args.data_file, 'r', encoding='utf-8') as f:
            images = json.load(f)
        print(f'从文件加载了 {len(images)} 张图片')
    else:
        images = SAMPLE_IMAGES.copy()
        print(f'使用示例数据: {len(images)} 张图片')
    
    # 如果指定了统一分类ID，替换所有图片的分类ID
    if args.category_id:
        for img in images:
            img['categoryId'] = args.category_id
        print(f'所有图片使用分类ID: {args.category_id}')
    
    # 验证图片数据
    print('')
    print('[0] 验证图片数据...')
    valid_images = []
    for i, img in enumerate(images):
        if not img.get('title') or not img.get('url') or not img.get('categoryId'):
            print(f'   跳过第 {i+1} 张图片: 缺少必要字段 (title, url, categoryId)')
            continue
        valid_images.append(img)
    
    if not valid_images:
        print('错误: 没有有效的图片数据')
        sys.exit(1)
    
    print(f'   有效图片: {len(valid_images)} 张')
    
    # 上传图片
    print('')
    success = upload_images(args.api_url, args.api_key, valid_images)
    
    print('')
    if success:
        print('====================================')
        print('   上传完成！')
        print('====================================')
    else:
        print('====================================')
        print('   上传失败，请检查错误信息')
        print('====================================')
        sys.exit(1)


if __name__ == '__main__':
    main()

